bitkeeper revision 1.1236.1.115 (42412feabO-NbNx001J5keVzgy_QUg)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 23 Mar 2005 08:59:22 +0000 (08:59 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 23 Mar 2005 08:59:22 +0000 (08:59 +0000)
Avoid unnecessary pte flags changes, which are costly on Xen. Also clean
up XCHG handling in instruction emulator a little bit.
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h
xen/arch/x86/x86_emulate.c

index 7e40d708d256717f7d651da6526740d142ecc7cc..d932c6c17f3be9c2012d2fd92e0bc5b8afb94cd4 100644 (file)
@@ -263,8 +263,17 @@ static inline int ptep_test_and_clear_young(pte_t *ptep)
        return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low);
 }
 
-static inline void ptep_set_wrprotect(pte_t *ptep)             { clear_bit(_PAGE_BIT_RW, &ptep->pte_low); }
-static inline void ptep_mkdirty(pte_t *ptep)                   { set_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); }
+static inline void ptep_set_wrprotect(pte_t *ptep)
+{
+       if (pte_write(*ptep))
+               clear_bit(_PAGE_BIT_RW, &ptep->pte_low);
+}
+
+static inline void ptep_mkdirty(pte_t *ptep)
+{
+       if (!pte_dirty(*ptep))
+               set_bit(_PAGE_BIT_DIRTY, &ptep->pte_low);
+}
 
 /*
  * Macro to mark a page protection value as "uncacheable".  On processors which do not support
index 80bac2dca6e8a766ba9e78149507be9511df7248..c7f752e7765e7bfa74ff734b699a0af593fe8d52 100644 (file)
@@ -668,18 +668,17 @@ x86_emulate_memop(
         emulate_2op_SrcV("test", src, dst, _regs.eflags);
         break;
     case 0x86 ... 0x87: /* xchg */
-        src.val ^= dst.val;
-        dst.val ^= src.val;
-        src.val ^= dst.val;
-        lock_prefix = 1;
-        /* Write back the source (temporary register location). */
+        /* Write back the register source. */
         switch ( dst.bytes )
         {
-        case 1: *(u8  *)src.ptr = (u8)src.val; break;
-        case 2: *(u16 *)src.ptr = (u16)src.val; break;
-        case 4: *src.ptr = (u32)src.val; break; /* 64b mode: zero-extend */
-        case 8: *src.ptr = src.val; break;
+        case 1: *(u8  *)src.ptr = (u8)dst.val; break;
+        case 2: *(u16 *)src.ptr = (u16)dst.val; break;
+        case 4: *src.ptr = (u32)dst.val; break; /* 64b mode: zero-extend */
+        case 8: *src.ptr = dst.val; break;
         }
+        /* Write back the memory destination with implicit LOCK prefix. */
+        dst.val = src.val;
+        lock_prefix = 1;
         break;
     case 0xa0 ... 0xa1: /* mov */
         dst.ptr = (unsigned long *)&_regs.eax;